package com.fau.wmbj.server.flowable.pojo.node;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.ScriptTask;
import org.flowable.bpmn.model.SequenceFlow;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 脚本任务
 *
 * @author jiawei
 * @version 1.0
 * @datetime 2024/6/24 下午2:33
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class ScriptNode extends Node {

    /**
     * 脚本名称
     */
    private String name;

    /**
     * 任务属性，其值必须为“script”，以指示任务的类型
     */
    private String type = "script";

    /**
     * 脚本语言的扩展属性（例如，javascript、groovy）
     */
    private String scriptFormat;

    /**
     * 要执行的脚本的字符串
     * 注意：以下名称是保留的，不能用作变量名：out、out:print、lang:import、context、elcontext。
     */
    private String script;

    /**
     * 脚本中定义的变量是否存储在执行上下文中
     */
    private Boolean autoStoreVariables = false;

    /**
     * 跳过表达式
     * 需要注意的是，如果我们要使用SkipExpression特性，必须要将_FLOWABLE_SKIP_EXPRESSION_ENABLED标志位变量设置为true。
     * 例：vars.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED",true);
     */
    private String skipExpression;

    /**
     * 通过指定服务任务定义的flowable:resultVariable属性来实现指定的流程变量会被服务流程的返回结果覆盖
     * 如果没有指定返回变量名,就会忽略返回结果
     */
    private String resultVariable;



    @Override
    public List<FlowElement> convert() {
        ArrayList<FlowElement> elements = new ArrayList<>();
        ScriptTask scriptTask = new ScriptTask();
        scriptTask.setId(this.getId());
        scriptTask.setName(this.getName());
        scriptTask.setScript(this.getScript());
        scriptTask.setScriptFormat(this.getScriptFormat());
        scriptTask.setAutoStoreVariables(this.getAutoStoreVariables());
        scriptTask.setSkipExpression(this.getSkipExpression());

        // 下一个节点的连线
        Node child = this.getChild();
        SequenceFlow sequenceFlow = this.buildSequence(child);
        elements.add(sequenceFlow);
        // 下一个节点
        if (Objects.nonNull(child)) {
            child.setBranchId(this.getBranchId());
            List<FlowElement> flowElements = child.convert();
            elements.addAll(flowElements);
        }
        return elements;
    }

}
